home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Tools / idle / Percolator.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  2.3 KB  |  78 lines

  1. from WidgetRedirector import WidgetRedirector
  2. from Delegator import Delegator
  3.  
  4. class Percolator:
  5.  
  6.     def __init__(self, text):
  7.         # XXX would be nice to inherit from Delegator
  8.         self.text = text
  9.         self.redir = WidgetRedirector(text)
  10.         self.top = self.bottom = Delegator(text)
  11.         self.bottom.insert = self.redir.register("insert", self.insert)
  12.         self.bottom.delete = self.redir.register("delete", self.delete)
  13.         self.filters = []
  14.  
  15.     def insert(self, index, chars, tags=None):
  16.         # Could go away if inheriting from Delegator
  17.         self.top.insert(index, chars, tags)
  18.  
  19.     def delete(self, index1, index2=None):
  20.         # Could go away if inheriting from Delegator
  21.         self.top.delete(index1, index2)
  22.  
  23.     def insertfilter(self, filter):
  24.         # Perhaps rename to pushfilter()?
  25.         assert isinstance(filter, Delegator)
  26.         assert filter.delegate is None
  27.         filter.setdelegate(self.top)
  28.         self.top = filter
  29.  
  30.     def removefilter(self, filter):
  31.         # XXX Perhaps should only support popfilter()?
  32.         assert isinstance(filter, Delegator)
  33.         assert filter.delegate is not None
  34.         f = self.top
  35.         if f is filter:
  36.             self.top = filter.delegate
  37.             filter.setdelegate(None)
  38.         else:
  39.             while f.delegate is not filter:
  40.                 assert f is not self.bottom
  41.                 f.resetcache()
  42.                 f = f.delegate
  43.             f.setdelegate(filter.delegate)
  44.             filter.setdelegate(None)
  45.  
  46.  
  47. def main():
  48.     class Tracer(Delegator):
  49.         def __init__(self, name):
  50.             self.name = name
  51.             Delegator.__init__(self, None)
  52.         def insert(self, *args):
  53.             print self.name, ": insert", args
  54.             apply(self.delegate.insert, args)
  55.         def delete(self, *args):
  56.             print self.name, ": delete", args
  57.             apply(self.delegate.delete, args)
  58.     from Tkinter import *
  59.     root = Tk()
  60.     root.wm_protocol("WM_DELETE_WINDOW", root.quit)
  61.     text = Text()
  62.     text.pack()
  63.     text.focus_set()
  64.     p = Percolator(text)
  65.     t1 = Tracer("t1")
  66.     t2 = Tracer("t2")
  67.     p.insertfilter(t1)
  68.     p.insertfilter(t2)
  69.     root.mainloop()
  70.     p.removefilter(t2)
  71.     root.mainloop()
  72.     p.insertfilter(t2)
  73.     p.removefilter(t1)
  74.     root.mainloop()
  75.  
  76. if __name__ == "__main__":
  77.     main()
  78.